package com.zyp.jobseeker.service.impl;

import com.zyp.jobseeker.entity.Enterprise;
import com.zyp.jobseeker.entity.Student;
import com.zyp.jobseeker.entity.User;
import com.zyp.jobseeker.enums.UserRole;
import com.zyp.jobseeker.enums.UserStatus;
import com.zyp.jobseeker.mapper.EnterpriseMapper;
import com.zyp.jobseeker.mapper.StudentMapper;
import com.zyp.jobseeker.mapper.UserMapper;
import com.zyp.jobseeker.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 用户服务实现类
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private StudentMapper studentMapper;
    @Autowired
    private EnterpriseMapper enterpriseMapper;
    private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
    /**
     * 学生用户注册
     */
    @Override
    public Long registerStudent(User user, Student student, String password) {
        // 设置用户基础信息
        user.setUsername(user.getUsername());
        user.setPassword(password); // 密码由上层传入已加密值
        user.setRole(UserRole.STUDENT);  // 直接使用枚举实例
        user.setStatus(UserStatus.PENDING);  // 直接使用枚举实例
//        user.setCreateTime(new Date());

        // 插入用户信息
        if (userMapper.insertUser(user) == 0) {
            return null;
        }
        //找到数据库中的id
        user.setId(userMapper.selectByUsername(user.getUsername()).getId());
        // 设置学生信息的用户ID
        student.setId(user.getId());
        studentMapper.insertStudent(student);
        // 插入学生详细信息
        return user.getId();
    }

    /**
     * 企业用户注册
     */
    @Override
    public Long registerEnterprise(User user, Enterprise enterprise, String password) {
        // 设置用户基础信息
        user.setUsername(user.getUsername());
        user.setPassword(password); // 密码由上层传入已加密值
        user.setRole(UserRole.ENTERPRISE);  // 直接使用枚举实例
        user.setStatus(UserStatus.PENDING);  // 直接使用枚举实例
//        user.setCreateTime(new Date());

        // 插入用户信息
        if (userMapper.insertUser(user) == 0) {
            return null;
        }
        //找到数据库中的id
        user.setId(userMapper.selectByUsername(user.getUsername()).getId());
        // 设置企业信息的用户ID
        enterprise.setId(user.getId());
        enterpriseMapper.insertEnterprise(enterprise);
        // 插入企业详细信息
        return  user.getId();
    }

    /**
     * 根据用户名查询用户
     */
    @Override
    public User findByUsername(String username) {
        System.out.println("[User Service] 🔍 开始查询用户: " + username);
        User user = userMapper.selectByUsername(username);
        if (user == null) {
            System.out.println("[User Service] ❌ 用户不存在: " + username);
        } else {
            System.out.println("[User Service] ✅ 找到用户: " + username + ", 状态: " + user.getStatus());
        }
        return user;
    }

    /**
     * 根据ID查询用户
     */
    @Override
    public User findById(Long id) {
        return userMapper.selectById(id);
    }

//    /**
//     * 更新用户信息
//     */
//    @Override
//    public boolean update(User user) {
//        return userMapper.updateUser(user) > 0;
//    }

    /**
     * 修改用户密码
     */
    @Override
    public boolean updatePassword(Long userId, String oldPassword, String newPassword) {
        return userMapper.updatePassword(userId, newPassword) > 0;
    }

    @Override
    public  Map<Long, Map<String, Object>> findByIds(List<Long> ids) {
        try {
            logger.info("[用户服务] 开始批量查询用户信息，用户ID数量: {}", ids.size());

            // 调用mapper层查询
            List<Map<String, Object>> userInfoList = userMapper.selectByIds(ids);

            // 构建企业ID->用户信息的映射
            Map<Long, Map<String, Object>> userInfoMap = userInfoList.stream()
                    .filter(userInfo -> userInfo.get("id") != null) // 过滤无效数据
                    .collect(Collectors.toMap(
                            userInfo -> (Long) userInfo.get("id"),  // 使用用户ID作为键
                            userInfo -> {
                                // 提取需要的基础信息字段
                                Map<String, Object> filteredInfo = new HashMap<>();
                                filteredInfo.put("userId", userInfo.get("id"));
                                filteredInfo.put("username", userInfo.get("username"));
                                filteredInfo.put("email", userInfo.get("email"));
                                filteredInfo.put("role", userInfo.get("role"));
                                filteredInfo.put("status", userInfo.get("status"));
                                filteredInfo.put("createTime", userInfo.get("create_time"));
                                return filteredInfo;
                            },
                            (existing, replacement) -> existing // 保留第一个出现的值
                    ));

            logger.info("[用户服务] 用户信息查询完成，成功匹配: {}/{}",
                    userInfoMap.size(), ids.size());
            return userInfoMap;

        } catch (Exception e) {
            logger.error("[用户服务] 用户信息查询失败", e);
            throw new RuntimeException("用户信息查询失败: " + e.getMessage());
        }
    }
}
